﻿#pragma once
#ifndef WRCLASSACTIVATOR_H
#define WRCLASSACTIVATOR_H

#include "WRType.h"

//定义类激活器类型标识 {D45445E6-F5AB-42B2-87E5-5CAB51994728}
#define WRClassActivatorType QUuid(0xd45445e6, 0xf5ab, 0x42b2, 0x87, 0xe5, 0x5c, 0xab, 0x51, 0x99, 0x47, 0x28)

namespace WRTypes
{
    //获取类激活器类型。
    WRSOFT_UTILITY_API WRType* classActivator(void);
}

//表示类激活器。
class WRClassActivator
{
private:
    //禁用复制构造函数和赋值操作符。
    Q_DISABLE_COPY(WRClassActivator)

protected:
    //初始化激活器。
    inline WRClassActivator(void)
    {
        //add code here
    }
    //释放当前对象所占用的相关资源。
    virtual ~WRClassActivator(void)
    {
        //add code here
    }

public:
    //获取当前对象类型。
    virtual WRType* type(void) const = 0;

    //识别当前对象是否是指定类型标识对象的实例。
    inline bool identify(const QUuid& tuid) const
    {
        WRType* type = this->type();
        while(type)
        {
            if (type->uuid() == tuid)
            {
                return true;
            }
            type = type->base();
        }
        return false;
    }
    //识别当前对象是否是指定类型对象的实例。
    inline bool identify(WRType* type) const
    {
        if (type)
        {
            WRType* type2 = this->type();
            while(type2)
            {
                if (type2 == type)
                {
                    return true;
                }
                type2 = type2->base();
            }
        }
        return false;
    }
};

#endif // WRCLASSACTIVATOR_H
